gtkentry: Add a "catchall" click gesture handler
authorCarlos Garnacho <carlosg@gnome.org>
Mon, 23 Aug 2021 13:31:37 +0000 (15:31 +0200)
committerCarlos Garnacho <carlosg@gnome.org>
Mon, 23 Aug 2021 13:38:33 +0000 (15:38 +0200)
This gesture is set on the whole widget surface, since there's
multiple input targets inside an entry (icons, the GtkText itself)
it makes sense to consider the full entry an area handling clicks.
Ensure these events don't propagate further up, and result in other
actions.

gtk/gtkentry.c

index e03127f1344865aa4553e57f2a29d282e49d6c18..9ad392ba3c3efd9b784b7eb55ce9b9a9978c08fb 100644 (file)
@@ -1464,16 +1464,33 @@ disconnect_text_signals (GtkEntry *entry)
   g_signal_handlers_disconnect_by_func (priv->text, notify_cb, entry);
 }
 
+static void
+catchall_click_press (GtkGestureClick *gesture,
+                      int              n_press,
+                      double           x,
+                      double           y,
+                      gpointer         user_data)
+{
+  gtk_gesture_set_state (GTK_GESTURE (gesture), GTK_EVENT_SEQUENCE_CLAIMED);
+}
+
 static void
 gtk_entry_init (GtkEntry *entry)
 {
   GtkEntryPrivate *priv = gtk_entry_get_instance_private (entry);
+  GtkGesture *catchall;
 
   priv->text = gtk_text_new ();
   gtk_widget_set_parent (priv->text, GTK_WIDGET (entry));
   gtk_editable_init_delegate (GTK_EDITABLE (entry));
   connect_text_signals (entry);
 
+  catchall = gtk_gesture_click_new ();
+  g_signal_connect (catchall, "pressed",
+                    G_CALLBACK (catchall_click_press), entry);
+  gtk_widget_add_controller (GTK_WIDGET (entry),
+                             GTK_EVENT_CONTROLLER (catchall));
+
   priv->editing_canceled = FALSE;
 }